package cn.hchaojie.javase.day11;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

import org.junit.Test;

public class TestStack {
	@Test
	public void test() {
		Stack<String> stack = new Stack<>();
		
		stack.push("java");
		stack.push("c++");
		stack.push("python");
		
//		System.out.println(stack.pop());
//		System.out.println(stack.pop());
//		System.out.println(stack.pop());
		
		while(!stack.isEmpty()) {
			System.out.println(stack.pop());
		}
	}
	
	@Test
	public void match() {
		// 全角符号
		// isValid("{([]())}") == true;
		assertTrue(isValid("{([]())}"));
		assertTrue(isValid("[(()()[])]"));
		assertFalse(isValid("[(])"));
		assertFalse(isValid("{{)}"));
		assertFalse(isValid("{"));
		assertFalse(isValid("())"));
		assertFalse(isValid(")("));
	}
	
	// 判断括号是否匹配
	/**
	 *
	 * @param str
	 * @return
	 */
	public static boolean isValid(String str) {
		Map<Character, Character> map = new HashMap<>();
		map.put('{', '}');
		map.put('(', ')');
		map.put('[', ']');
		
		Stack<Character> stack = new Stack<>();

		// 遍历str每个括号
		for (int i = 0; i < str.length(); i++) {
			char c = str.charAt(i);
			
			// 判断字符是否是左括号
			boolean isLeft = (c == '{' || c == '(' || c == '[');
			if (isLeft) {
				// 入栈
				stack.push(c);		// 自动装箱(char -> Character)，自动拆箱	(Character -> char)
			} else {
				// 取栈顶括号
				if (stack.isEmpty()) {
					return false;
				}

				char top = stack.pop();
				// 判断栈顶括号是否和当前括号匹配  top == '{'   c == '}'
				// 如果不匹配，return false
				if (map.get(top) != c) {
					return false;
				}
				
//				if (stack.isEmpty() || stack.pop() != c) {
//					return false;
//				}
			}
		}
		
		// 没有找到不匹配的括号
		
		// 判断栈是否为空
		if (!stack.isEmpty()) {
			return false;
		}
		
		return true;
	}
}
